home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / decprom / ds3100.md / devDecProm.c < prev    next >
C/C++ Source or Header  |  1991-08-30  |  3KB  |  137 lines

  1. /* 
  2.  * devDecProm.c --
  3.  *
  4.  *    Routines that access the Dec PROM device drivers.  This code is
  5.  *    based on DecOS bootstrap code in boot/os/devio.c
  6.  *
  7.  * Copyright 1989 Regents of the University of California
  8.  * Permission to use, copy, modify, and distribute this
  9.  * software and its documentation for any purpose and without
  10.  * fee is hereby granted, provided that the above copyright
  11.  * notice appear in all copies.  The University of California
  12.  * makes no representations about the suitability of this
  13.  * software for any purpose.  It is provided "as is" without
  14.  * express or implied warranty.
  15.  */
  16.  
  17. #ifdef notdef
  18. static char rcsid[] = "$Header: /sprite/src/boot/decprom/ds3100.md/RCS/devDecProm.c,v 1.1 90/02/16 16:14:07 shirriff Exp $ SPRITE (Berkeley)";
  19. #endif /* not lint */
  20.  
  21. #define BOOT_DEV "rz()"
  22.  
  23. #include "sprite.h"
  24. #include "user/fs.h"
  25. #include "kernel/dev.h"
  26. #include "kernel/devFsOpTable.h"
  27. #include "boot.h"
  28. #define _MONFUNCS
  29. #include "kernel/machMon.h"
  30.  
  31. #define DEV_BSIZE 8192
  32.  
  33. #define READ 0
  34. #define WRITE 1
  35.  
  36.  
  37. /*
  38.  *----------------------------------------------------------------------
  39.  *
  40.  * DecPromDevOpen --
  41.  *
  42.  *    Open the device used for booting.  This depends on the initialization
  43.  *    of the devicePtr->data field done in Dev_Config.
  44.  *
  45.  * Results:
  46.  *    SUCCESS or FAILURE.
  47.  *
  48.  * Side effects:
  49.  *    None.
  50.  *
  51.  *----------------------------------------------------------------------
  52.  */
  53. ReturnStatus
  54. DecPromDevOpen(devicePtr)
  55.     Fs_Device    *devicePtr;    /* Sprite device description */
  56. {
  57.     int fd;
  58.  
  59.     fd = Mach_MonOpen(BOOT_DEV,READ);
  60.     if (fd>0) {
  61.     devicePtr->unit = fd;
  62.     return SUCCESS;
  63.     } else {
  64. #ifndef NO_PRINTF
  65.     Mach_MonPrintf("Open failure\n");
  66. #endif
  67.     return FAILURE;
  68.     }
  69. }
  70.  
  71.  
  72. /*
  73.  *----------------------------------------------------------------------
  74.  *
  75.  * DecPromDevRead --
  76.  *
  77.  *    Read from the boot device used for booting.
  78.  *
  79.  * Results:
  80.  *    SUCCESS or FAILURE.
  81.  *
  82.  * Side effects:
  83.  *    The read operation.
  84.  *
  85.  *----------------------------------------------------------------------
  86.  */
  87. ReturnStatus
  88. DecPromDevRead(devicePtr, offset, len, buffer, numBytesPtr)
  89.     Fs_Device    *devicePtr;    /* Sprite device description */
  90.     int offset;            /* Byte offset */
  91.     int len;            /* Byte count;
  92.     char *buffer;        /* Address to read into */
  93.     int *numBytesPtr;        /* Return, the amount actually read */
  94. {
  95.     register int fd = devicePtr->unit;
  96.     register int numBytes;
  97.     register int totalBytes;
  98.     register int toRead;
  99.     int status;
  100.  
  101.     status = Mach_MonLseek(fd, offset, 0);
  102.     if (status<0) {
  103. #ifndef NO_PRINTF
  104.     Mach_MonPrintf("Lseek failure\n");
  105. #endif
  106.     return FAILURE;
  107.     }
  108.  
  109.     /*
  110.      * Break the I/O in to chunks that are edible by the device.
  111.      */
  112.     totalBytes = 0;
  113.     while (len > 0) {
  114.     if (len > DEV_BSIZE) {
  115.         toRead = DEV_BSIZE;
  116.     } else {
  117.         toRead = len;
  118.     }
  119.     numBytes = Mach_MonRead(fd, buffer, toRead);
  120.     if (numBytes <= 0) {
  121.         break;
  122.     }
  123.     buffer += numBytes;
  124.     len -= numBytes;
  125.     totalBytes += numBytes;
  126.     }
  127.     *numBytesPtr = totalBytes;
  128.     if (numBytes <= 0) {
  129. #ifndef NO_PRINTF
  130.     Mach_MonPrintf("Read failure: read(%d, %x, %x)\n",fd,buffer,toRead);
  131. #endif
  132.     return(FAILURE);
  133.     } else {
  134.     return(SUCCESS);
  135.     }
  136. }
  137.